package com.pliu.handler;


import com.pliu.request.Request;

/**
 * 抽象处理者
 * 处理请求的接口或者抽象类，提供了处理请求的的方法和设置下一个处理者的方法。
 */
public abstract class Handler {

    /**
     * 持有一个自己的引用,用来设置下一个处理者
     */
    private Handler nextHandler;

    //当前处理者能审批通过的最多天数
    public int maxDay;

    protected Handler(int maxDay){
        this.maxDay = maxDay;
    }

    /**
     * 设置责任链中下一个处理请求的对象
     */
    public void setNextHandler(Handler handler){
        nextHandler = handler;
    }

    public void handleRequest(Request request){
        if(request.getLeaveDays() <= maxDay){
            reply(request);
        }else{
            if(nextHandler != null){
                System.out.println(this.getClass().getSimpleName()+": 我审批权限不够，已向上级请示");
                //审批权限不够，请示上级
                nextHandler.handleRequest(request);
            }else{
                System.out.println("已经没有下一个处理者了...");
            }
        }
    }

    //交由具体的handler来实现
    protected abstract void reply(Request request);

}